package simpledb;

import simpledb.common.Database;
import simpledb.common.Type;
import simpledb.execution.SeqScan;
import simpledb.storage.HeapFile;
import simpledb.storage.Tuple;
import simpledb.storage.TupleDesc;
import simpledb.transaction.TransactionId;

import java.io.File;

/**
 * 测试类：演示如何创建一个简单的数据库表结构、加载数据文件，并使用 SeqScan 扫描并输出其中的元组。
 */
public class lab1_SimpleQueryTest {

    public static void main(String[] argv) {

        // 构造一个包含 3 个字段的表结构（schema）
        Type types[] = new Type[]{ Type.INT_TYPE, Type.INT_TYPE, Type.INT_TYPE };
        String names[] = new String[]{ "field0", "field1", "field2" };

        // 创建 TupleDesc 对象，描述该表的字段类型和名称
        TupleDesc descriptor = new TupleDesc(types, names);

        // 创建一个 HeapFile 表对象，关联磁盘上的数据文件 some_data_file.dat
        HeapFile table1 = new HeapFile(new File("some_data_file.dat"), descriptor);

        // 并通过 Catalog 注册这张表，表名为 "test"
        Database.getCatalog().addTable(table1, "test");

        // 构建查询语句：使用 SeqScan 进行全表扫描，通过迭代器逐条获取元组
        TransactionId tid = new TransactionId(); // 创建事务 ID
        SeqScan f = new SeqScan(tid, table1.getId()); // 使用 SeqScan 扫描这张表的数据

        try {
            // 打开扫描器，开始遍历元组
            f.open();

            // 循环读取所有元组
            while (f.hasNext()) {
                Tuple tup = f.next(); // 获取下一条记录
                System.out.println(tup); // 输出元组内容
            }

            // 关闭扫描器
            f.close();

            // 提交事务（标记本次事务完成）
            Database.getBufferPool().transactionComplete(tid);

        } catch (Exception e) {
            // 捕获异常并打印错误信息
            System.out.println ("发生异常 : " + e);
        }
    }
}
